这是根据杭电阶乘位数改的题目 有矩阵知识(代数余子式啥的)可得逆推: 22的时候有两种对角形式 33的时候代数余子式按1行或按1列展开就是3个位置和三个22的形式所以就是23=6种方案 以此类推这就是N*N的方案书就是N!
n
!
=
2
π
n
(
n
e
)
n
n!=\sqrt{2\pi n}(\frac{n}{e})^n
n!=2πn
(en)n 不计算值,只计算位数,所以想到两边开
l
g
lg
lg
l
g
(
n
!
)
=
l
g
(
1
)
+
l
g
(
2
)
+
.
.
.
+
l
g
(
n
)
=
1
2
l
g
(
2
π
n
)
+
n
l
g
(
n
e
)
=
l
g
_
n
_
v
a
l
u
e
lg(n!)=lg(1)+lg(2)+...+lg(n)=\frac{1}{2}lg({2\pi n})+nlg(\frac{n}{e})=lg\_n\_value
lg(n!)=lg(1)+lg(2)+...+lg(n)=21lg(2πn)+nlg(en)=lg_n_value 位数就是上述数字的值向下取整+1
−
>
->
−>
a
n
s
=
⌊
l
g
_
n
_
v
a
l
u
e
⌋
+
1
ans = \lfloor lg\_n\_value\rfloor+1
ans=⌊lg_n_value⌋+1
哦对了,如果想知道那个式子为啥,看斯特林公式,有一说一我还看不懂(没敢看,有点嘚)
代码:
/*
* @Descripttion:
* @Author: ssw
* @Date: 2020-11-28 00:21:11
* @LastEditors: ssw
* @LastEditTime: 2021-01-06 16:28:41
*/
#include
using namespace std;
using ll = long long;
const double PI = acos(-1);
ll T,N;
int Stirling(double n){
double ans = log10(2 * PI * n) / 2 + n * log10(n / exp(1));
return floor(ans)+1;
}
int main()
{
// freopen("1.in", "r", stdin);
// freopen("1.out", "w", stdout);
cin >> T;
while(T--)
{
cin >> N;
cout |